package de.lengnis.games.brickdrop.view;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;

import javax.swing.BorderFactory;
import javax.swing.JComponent;

import com.jgoodies.forms.builder.PanelBuilder;
import com.jgoodies.forms.layout.CellConstraints;
import com.jgoodies.forms.layout.FormLayout;

import de.lengnis.games.brickdrop.event.SpielfeldEventListener;
import de.lengnis.games.brickdrop.model.Brick;
import de.lengnis.games.brickdrop.model.SchrittweiteTyp;
import de.lengnis.games.brickdrop.model.Spielfeld;

public class MainView implements View {

    public JComponent createView() {

        Spielfeld spielfeld = new Spielfeld();
        NaechsterBrickPanel naechsterBrickPanel = new NaechsterBrickPanel(spielfeld);

        spielfeld.addSpielfeldEventListener(naechsterBrickPanel);

        CellConstraints cc = new CellConstraints();

        PanelBuilder panelBuilder = new PanelBuilder(new FormLayout("pref, 5px, pref", "" + NaechsterBrickPanel.HEIGHT + "px," + (Spielfeld.HEIGHT - NaechsterBrickPanel.HEIGHT) + "px"));
        panelBuilder.add(spielfeld, cc.xywh(1, 1, 1, 2));
        panelBuilder.add(naechsterBrickPanel, cc.xy(3, 1));

        panelBuilder.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));

        return panelBuilder.getPanel();
    }

    @SuppressWarnings("serial")
    public static class NaechsterBrickPanel extends JComponent implements SpielfeldEventListener {

        private static final int WIDTH  = 100;
        private static final int HEIGHT = 100;

        private Spielfeld        spielfeld;

        public NaechsterBrickPanel(Spielfeld spielfeld) {
            this.spielfeld = spielfeld;

            setBorder(BorderFactory.createLineBorder(Color.BLACK));
            setPreferredSize(new Dimension(WIDTH, HEIGHT));
        }

        @Override
        protected void paintComponent(Graphics g) {

            Graphics2D g2 = (Graphics2D) g;

            g2.setColor(Color.BLACK);
            g2.fillRect(0, 0, getWidth(), getHeight());

            Spielfeld.maleRaster(g2, WIDTH, HEIGHT);

            Brick naechsterBrick = spielfeld.getNaechsterBrick();

            naechsterBrick.zentrieren(getWidth(), getHeight(), SchrittweiteTyp.FEIN);

            naechsterBrick.malen(g2);
        }

        public void spielfeldChanged() {
            repaint();
        }
    }
}
